#include <iostream>
class B;
class A {
    public:
    static void showBNumber(B &b);
    static void showCNumber(B &b);
};

class B {
    public:
    B(int num1, int num2 = 300):b_num_(num1),c_num_(num2){

    };
    int outterNum() const{
        return b_num_;
    }
    private:
    // 这样之后A中的showNumber方法就可以获取B中所有的私有成员了
    friend void A::showBNumber(B &b);
    int b_num_;
    int c_num_;
};

int operator*(const int n, const B &b) {
    return n * b.outterNum();
}

// 这个方法必须要在B的定义之后才可以，否则会报错：
/*
error: member access into incomplete type 'B'
 cout << "b's b_num_ 的值是: " << b.b_num_ << endl;
*/
void A::showBNumber(B &b){
    using namespace std;
    cout << "b's b_num_ 的值是: " << b.b_num_ << endl;
}

//  error: 'c_num_' is a private member of 'B'
//  由于B没有和A的showCNumber方法交朋友
void A::showCNumber(B &b) {
    using namespace std;
    // cout << "b's c_num_ 的值是: " << b.c_num_ << endl;
}

int use_friend_main() {
    B b(200);
    A::showBNumber(b);
    A::showCNumber(b);
    // 要想该方法被编译，就要让 * 操作符函数成为非成员函数，同时将 int作为第一个参数，这样编译器就会去找这样的函数了。 
    std::cout << " 2 * b = " << 2 * b << std::endl;
    return 0;
}
